import 'package:flutter/painting.dart';
import 'package:ideology/shared/widgets/code_input/highlight/highlight_theme.dart';
import 'package:ideology/shared/widgets/code_input/highlight/syntax_highlighter.dart';
import 'package:ideology/shared/widgets/code_input/highlight/syntax_preset.dart';

/// **Snow-Lang** 的关键字集合。
///
/// 按照 Snow-Lang 的语言规范整理，涵盖：
/// - **模块与声明**：`parameter`, `module`, `import`, `end`, `globals`, `struct`, `function`, `params`, `declare`
/// - **流程控制**：`if`, `then`, `else`, `loop`, `init`, `cond`, `step`, `break`, `continue`
/// - **特殊引用**：`self`
/// - **基本类型**：`byte`, `short`, `int`, `long`, `float`, `double`, `bool`, `void`
/// - **带位数限定的类型**：`byte8`, `short16`, `int32`, `long64`, `float32`, `double64`
/// - **布尔字面量**：`true`, `false`
///
/// 匹配规则：
/// - 实际由 [SyntaxHighlighter] 控制，一般按单词边界匹配。
/// - 不会误把变量名中的子串高亮成关键字。
const Set<String> snowKeywords = {
  'parameter',
  'module',
  'import',
  'end',
  'globals',
  'struct',
  'function',
  'params',
  'return',
  'returns',
  'body',
  'declare',
  'if',
  'then',
  'else',
  'loop',
  'init',
  'cond',
  'step',
  'break',
  'continue',
  'self',
  'byte',
  'short',
  'int',
  'long',
  'float',
  'double',
  'bool',
  'void',
  'byte8',
  'short16',
  'int32',
  'long64',
  'float32',
  'double64',
  'true',
  'false',
};

/// 构建一个 **Snow-Lang** 语法高亮预设。
///
/// - [base]：传入的基础 [TextStyle]，决定字体族、字号等通用样式；
/// - 返回的 [SyntaxPreset] 包含：
///   - [HighlightTheme.light]：基于 [base] 的浅色主题；
///   - [SyntaxHighlighter]：配置了 [snowKeywords] 作为高亮关键字集合；
///
/// ### 使用示例
/// ```dart
/// final preset = makeSnowPreset(
///   const TextStyle(fontFamily: 'Fira Code', fontSize: 14),
/// );
///
/// // 将 preset.theme 和 preset.highlighter
/// // 注入到代码编辑控件，即可获得 Snow-Lang 语法高亮效果
/// ```
SyntaxPreset makeSnowPreset(TextStyle base) {
  // 1. 基于基础 TextStyle 创建浅色主题
  final theme = HighlightTheme.light(base: base);

  // 2. 构建语法高亮器，传入 Snow-Lang 关键字集合
  final highlighter = SyntaxHighlighter(
    keywords: snowKeywords,
    theme: theme,
  );

  // 3. 打包为 SyntaxPreset 返回
  return SyntaxPreset(highlighter: highlighter, theme: theme);
}
